package com.mrzhou.swagger.util;

import com.google.common.base.Function;
import com.google.common.base.Optional;
import springfox.documentation.RequestHandler;

import java.util.Iterator;
import java.util.List;
import java.util.function.Predicate;

public class SwaggerUtil {

    /**
     *  Optional.transform(), 如果Optional中的对象存在, 这执行给定的函数
     *  Optional.or(): 返回Optional包含的内容，如果为空，则返回指定的值
     * @param basePackages
     * @return
     */
    public static Predicate<RequestHandler> basePackages(List<String> basePackages) {
        return (requestHandler) -> {
            return declaringClass(requestHandler).transform(handlerPackage(basePackages)).or(true);
        };
    }

    /**
     *  判断类的包路径是否包含在basePackages集合中
     * @param basePackages
     * @return
     */
    private static Function<Class<?>, Boolean> handlerPackage(final List<String> basePackages) {
        return (aClass) -> {
            Iterator<String> var2 = basePackages.iterator();

            boolean isMatch;
            do {
                if(!var2.hasNext()) {
                    return false;
                }
                String str = var2.next();
                isMatch = aClass.getPackage().getName().startsWith(str);
            } while (!isMatch);
            return true;
        };
    }

    /**
     *  Optional.fromNullable(T) 将一个T的实例装换为Optional对象, T的实例可以为null, 也可以不为null
     * @param input
     * @return
     */
    private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {
        return Optional.fromNullable(input.declaringClass());
    }

}
